#!/bin/bash

# Debian 内核源码获取脚本 (从官方 deb 包)
# 功能：从 Debian 官方源下载指定版本的内核源码 deb 包并解压
# 作者：自动生成
# 使用方法：./get_debian_kernel_source_from_deb.sh [版本号]
# 示例：./get_debian_kernel_source_from_deb.sh 4.19.67-2+deb10u1~bpo9+1

set -e  # 遇到错误立即退出

# 默认版本号
DEFAULT_VERSION="4.19.67-2+deb10u1~bpo9+1"

# 显示帮助信息
show_help() {
    cat << EOF
Debian 内核源码获取脚本 (从官方 deb 包)

用法:
    $0 [选项] [版本号]

选项:
    -h, --help      显示此帮助信息并退出

参数:
    版本号          指定要下载的 Debian 内核版本号
                   如果不指定，将使用默认版本: $DEFAULT_VERSION

支持的版本格式:
    - 标准格式:     4.19.67-2+deb10u1
    - 带bpo版本:    4.19.67-2+deb10u1~bpo9+1
    - 复杂格式:     4.9.88-1+deb9u1

示例:
    $0                                    # 使用默认版本
    $0 4.19.67-2+deb10u1                 # 下载指定版本
    $0 4.19.67-2+deb10u1~bpo9+1          # 下载带bpo的版本
    $0 --help                            # 显示帮助信息

功能说明:
    1. 从 Debian 官方源下载内核源码 deb 包
    2. 使用 dpkg-deb 解压 deb 包
    3. 提取内核源码压缩包
    4. 解压到当前目录并重命名为 Debian_{版本号}
    5. 清理临时文件

输出目录:
    源码目录: Debian_{版本号}

依赖要求:
    - wget 或 curl
    - dpkg-deb
    - tar

注意事项:
    - 需要网络连接下载 deb 包
    - 脚本会自动清理同名的旧目录
    - 会尝试两个官方下载地址
    - 生成的源码可直接用于编译内核

EOF
}

# 获取版本号参数
if [ $# -eq 0 ]; then
    echo "使用默认版本: $DEFAULT_VERSION"
    VERSION="$DEFAULT_VERSION"
else
    # 检查是否是帮助参数
    case "$1" in
        -h|--help)
            show_help
            exit 0
            ;;
        *)
            VERSION="$1"
            echo "使用指定版本: $VERSION"
            ;;
    esac
fi

# 解析版本号，提取主版本号
# 例如：4.19.67-2+deb10u1~bpo9+1 -> 4.19
KERNEL_MAJOR_VERSION=$(echo "$VERSION" | sed -E 's/^([0-9]+\.[0-9]+)\..*$/\1/')
echo "内核主版本: $KERNEL_MAJOR_VERSION"
echo "完整版本: $VERSION"

# 生成 deb 包文件名
# 格式：linux-source-{主版本}_{完整版本}_all.deb
DEB_FILENAME="linux-source-${KERNEL_MAJOR_VERSION}_${VERSION}_all.deb"
echo "deb 包文件名: $DEB_FILENAME"

# 定义下载地址
URL1="https://debian.sipwise.com/debian-security/pool/main/l/linux/${DEB_FILENAME}"
URL2="https://debian.sipwise.com/debian/pool/main/l/linux/${DEB_FILENAME}"

# 定义目录和文件名
TEMP_DIR="temp"
SOURCE_TAR="linux-source-${KERNEL_MAJOR_VERSION}.tar.xz"
SOURCE_DIR="linux-source-${KERNEL_MAJOR_VERSION}"
FINAL_DIR="Debian_${VERSION}"

echo "======================================"
echo "开始环境检测"
echo "======================================"

# 检查必要的命令是否存在
check_command() {
    if ! command -v "$1" &> /dev/null; then
        echo "错误: 命令 '$1' 未找到，请先安装"
        exit 1
    else
        echo "✓ 检测到命令: $1"
    fi
}

# 检查下载工具
if command -v "wget" &> /dev/null; then
    DOWNLOAD_CMD="wget"
    echo "✓ 检测到下载工具: wget"
elif command -v "curl" &> /dev/null; then
    DOWNLOAD_CMD="curl"
    echo "✓ 检测到下载工具: curl"
else
    echo "错误: 未找到 wget 或 curl，请先安装其中一个"
    exit 1
fi

# 检查必要的系统命令
check_command "dpkg-deb"
check_command "tar"

echo "======================================"
echo "开始清理和准备"
echo "======================================"

# 清理旧的目录和文件（如果存在）
if [ -d "$FINAL_DIR" ]; then
    echo "清理旧的源码目录: $FINAL_DIR"
    rm -rf "$FINAL_DIR"
fi

if [ -d "$TEMP_DIR" ]; then
    echo "清理旧的临时目录: $TEMP_DIR"
    rm -rf "$TEMP_DIR"
fi

if [ -f "$DEB_FILENAME" ]; then
    echo "清理旧的 deb 文件: $DEB_FILENAME"
    rm -f "$DEB_FILENAME"
fi

if [ -d "$SOURCE_DIR" ]; then
    echo "清理旧的解压目录: $SOURCE_DIR"
    rm -rf "$SOURCE_DIR"
fi

echo "======================================"
echo "开始下载 deb 包"
echo "======================================"

# 尝试下载 deb 包
download_success=false

echo "尝试从第一个地址下载..."
echo "URL: $URL1"

if [ "$DOWNLOAD_CMD" = "wget" ]; then
    if wget -q --spider "$URL1" 2>/dev/null; then
        echo "✓ 第一个地址可访问，开始下载..."
        if wget "$URL1" -O "$DEB_FILENAME"; then
            echo "✓ 从第一个地址下载成功"
            download_success=true
        else
            echo "✗ 从第一个地址下载失败"
        fi
    else
        echo "✗ 第一个地址不可访问"
    fi
else
    if curl -s --head "$URL1" >/dev/null 2>&1; then
        echo "✓ 第一个地址可访问，开始下载..."
        if curl -L "$URL1" -o "$DEB_FILENAME"; then
            echo "✓ 从第一个地址下载成功"
            download_success=true
        else
            echo "✗ 从第一个地址下载失败"
        fi
    else
        echo "✗ 第一个地址不可访问"
    fi
fi

# 如果第一个地址失败，尝试第二个地址
if [ "$download_success" = false ]; then
    echo "尝试从第二个地址下载..."
    echo "URL: $URL2"
    
    if [ "$DOWNLOAD_CMD" = "wget" ]; then
        if wget -q --spider "$URL2" 2>/dev/null; then
            echo "✓ 第二个地址可访问，开始下载..."
            if wget "$URL2" -O "$DEB_FILENAME"; then
                echo "✓ 从第二个地址下载成功"
                download_success=true
            else
                echo "✗ 从第二个地址下载失败"
            fi
        else
            echo "✗ 第二个地址不可访问"
        fi
    else
        if curl -s --head "$URL2" >/dev/null 2>&1; then
            echo "✓ 第二个地址可访问，开始下载..."
            if curl -L "$URL2" -o "$DEB_FILENAME"; then
                echo "✓ 从第二个地址下载成功"
                download_success=true
            else
                echo "✗ 从第二个地址下载失败"
            fi
        else
            echo "✗ 第二个地址不可访问"
        fi
    fi
fi

# 检查下载是否成功
if [ "$download_success" = false ]; then
    echo "错误: 从两个地址都无法下载 deb 包"
    echo "请检查:"
    echo "1. 网络连接是否正常"
    echo "2. 版本号是否正确: $VERSION"
    echo "3. 生成的文件名是否正确: $DEB_FILENAME"
    exit 1
fi

# 验证下载的文件
if [ ! -f "$DEB_FILENAME" ]; then
    echo "错误: deb 文件不存在: $DEB_FILENAME"
    exit 1
fi

file_size=$(stat -c%s "$DEB_FILENAME" 2>/dev/null || stat -f%z "$DEB_FILENAME" 2>/dev/null || echo "0")
if [ "$file_size" -lt 1000 ]; then
    echo "错误: deb 文件太小，可能下载不完整: $file_size 字节"
    exit 1
fi

echo "✓ deb 包下载完成，文件大小: $file_size 字节"

echo "======================================"
echo "开始解压 deb 包"
echo "======================================"

# 创建临时目录
echo "创建临时目录: $TEMP_DIR"
mkdir -p "$TEMP_DIR"

# 使用 dpkg-deb 解压 deb 包
echo "正在解压 deb 包..."
if dpkg-deb -x "$DEB_FILENAME" "$TEMP_DIR"; then
    echo "✓ deb 包解压成功"
else
    echo "错误: deb 包解压失败"
    exit 1
fi

# 检查源码压缩包是否存在
SOURCE_TAR_PATH="$TEMP_DIR/usr/src/$SOURCE_TAR"
if [ ! -f "$SOURCE_TAR_PATH" ]; then
    echo "错误: 源码压缩包不存在: $SOURCE_TAR_PATH"
    echo "临时目录内容:"
    find "$TEMP_DIR" -type f -name "*.tar.xz" 2>/dev/null || echo "未找到 .tar.xz 文件"
    exit 1
fi

echo "✓ 找到源码压缩包: $SOURCE_TAR_PATH"

echo "======================================"
echo "开始解压源码"
echo "======================================"

# 解压源码压缩包到当前目录
echo "正在解压源码压缩包..."
if tar -xf "$SOURCE_TAR_PATH"; then
    echo "✓ 源码解压成功"
else
    echo "错误: 源码解压失败"
    exit 1
fi

# 检查解压后的目录是否存在
if [ ! -d "$SOURCE_DIR" ]; then
    echo "错误: 解压后的源码目录不存在: $SOURCE_DIR"
    echo "当前目录内容:"
    ls -la | grep "linux-source" || echo "未找到 linux-source 目录"
    exit 1
fi

echo "✓ 源码目录已生成: $SOURCE_DIR"

# 重命名目录
echo "重命名目录: $SOURCE_DIR -> $FINAL_DIR"
if mv "$SOURCE_DIR" "$FINAL_DIR"; then
    echo "✓ 目录重命名成功"
else
    echo "错误: 目录重命名失败"
    exit 1
fi

echo "======================================"
echo "开始清理临时文件"
echo "======================================"

# 清理临时目录
echo "清理临时目录: $TEMP_DIR"
rm -rf "$TEMP_DIR"
echo "✓ 临时目录清理完成"

# 清理 deb 文件
echo "清理 deb 文件: $DEB_FILENAME"
rm -f "$DEB_FILENAME"
echo "✓ deb 文件清理完成"

echo "======================================"
echo "处理完成！"
echo "======================================"
echo "🎉 Debian 内核源码已准备完成！"
echo ""
echo "📁 目录信息:"
echo "   源码目录: $FINAL_DIR"
echo ""
echo "📋 版本信息:"
echo "   内核主版本: $KERNEL_MAJOR_VERSION"
echo "   完整版本: $VERSION"
echo ""
echo "🚀 接下来你可以:"
echo "   1. 进入目录: cd $FINAL_DIR"
echo "   2. 开始学习内核源码"
echo "   3. 配置编译环境: make menuconfig"
echo "   4. 编译内核: make -j\$(nproc)"
echo ""
echo "📝 重要说明:"
echo "   - 源码来自 Debian 官方 deb 包"
echo "   - 已自动清理所有临时文件"
echo "   - 源码可直接用于编译内核"
echo "   - 此方法获取的是 Debian 打包的内核源码"
echo ""
echo "✅ 脚本执行成功完成！"
